package com.woniuxy.controller;

import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.InitializingBean;

import cn.hutool.core.date.DateUtil;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
// 假设 ImSingle 和 ImSingleService 位于以下包路径，需根据实际情况调整
import com.woniuxy.service.ImSingleService;
import com.woniuxy.entity.Chat;


import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint(value = "/imserverSingle")
@Component
public class ImSingleController implements InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(ImSingleController.class);

    /**
     * 记录当前在线连接数
     */
    public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();

    @Resource
    ImSingleService imSingleService;

    static ImSingleService staticImSingleService;

    @Override
    public void afterPropertiesSet() throws Exception {
        // InitializingBean 接口方法，可在此做初始化操作，代码里未完整实现逻辑
        staticImSingleService = this.imSingleService;
    }

    /**
     * 新建连接时调用的方法
     * @param session WebSocket 会话对象
     */
    @OnOpen
    public void onOpen(Session session) {
        sessionMap.put(session.getId(), session);
        log.info("[onOpen] 新建连接，session={}，当前在线人数为：{}", session.getId(), sessionMap.size());
    }

    /**
     * 连接关闭时调用的方法
     * @param session WebSocket 会话对象
     */
    @OnClose
    public void onClose(Session session) {
        sessionMap.remove(session.getId());
        log.info("[onClose] 有一连接关闭，session={}，当前在线人数为：{}", session.getId(), sessionMap.size());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param fromSession 发送消息的会话对象
     */
    @OnMessage
    public void onMessage(String message, Session fromSession) {
        log.info("服务端收到消息:{}", message);
        Chat imSingle = JSONObject.parseObject(message, Chat.class);
        imSingle.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        // 存储数据到数据库
        staticImSingleService.add(imSingle);
        String jsonStr = JSONObject.toJSONString(imSingle); // 处理后的消息体
        this.sendAllMessage(jsonStr);
        log.info("[onMessage] 发送消息：{}", jsonStr);
    }

    /**
     * WebSocket 错误处理方法，当连接出现错误时调用
     * @param session 出现错误的 WebSocket 会话
     * @param error 抛出的异常
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("[onError] 发生错误", error);
    }

    /**
     * 服务端发送消息给除发送者外的其他客户端
     * @param fromSession 发送消息的客户端会话（用于排除自身）
     * @param message 要发送的消息内容
     */
    private void sendMessage(Session fromSession, String message) {
        sessionMap.values().forEach(session -> {
            if (fromSession != session) {
                log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
                try {
                    session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    log.error("服务端发送消息给客户端异常", e);
                }
            }
        });
    }

    /**
     * 服务端发送消息给所有客户端
     * @param message 要发送的消息内容
     */
    private void sendAllMessage(String message) {
        try {
            for (Session session : sessionMap.values()) {
                log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
                session.getBasicRemote().sendText(message);
            }
        } catch (Exception e) {
            log.error("服务端发送消息给客户端失败", e);
        }
    }
}

